home *** CD-ROM | disk | FTP | other *** search
/ Universität Tübingen - 1997/1998 Winter / Universität Tübingen - Wintersemester 1997-98 - Uni-Informationssystem und Stadt-Informationssystem.iso / kzp / led / script.jav < prev   
Text File  |  1997-08-14  |  14KB  |  472 lines

  1. ///////////////////////////////////////////////////////////////////
  2. //  Script.java   -- LED Sign V1.0f
  3. //
  4. //  Contains the following classes:
  5. //      linkList   -- a linked list class to store the script
  6. //      FuncInfo   -- a class (struct) to hold all the 
  7. //                    information for any function.
  8. //      Script     -- The class that manages the script
  9. //                    including parsing, storage, and
  10. //                    retrieval.
  11. //
  12. //  Revisions:
  13. //     V1.0f: Written July 17 - August 6, 1995
  14. //
  15. //  by Darrick Brown
  16. //     dbrown@cs.hope.edu
  17. //     http://www.cs.hope.edu/~dbrown/
  18. //
  19. //  ╗ Copyright 1995
  20. ///////////////////////////////////////////////////////////////////
  21.  
  22. package LED;
  23.  
  24. import java.awt.*;
  25. import java.io.*;
  26. import java.net.*;
  27.  
  28. ///////////////////////////////////////////////////////////////////
  29. // Function            Code
  30. // --------            ----
  31. // Appear               0
  32. // Sleep                1
  33. // ScrollLeft           2
  34. // ScrollRight          3
  35. // ScrollUp             4
  36. // ScrollDown           5
  37. // Pixel                6
  38. // Blink                7
  39. // OverRight            8
  40. // ScrollCenter         9
  41. // OverCenter           10
  42. // OverLeft             11
  43. // OverUp               12
  44. // OverDown             13
  45. // Do                   97
  46. // Repeat               98
  47. // Reload               99
  48. ///////////////////////////////////////////////////////////////////
  49.  
  50. // A hacked linked list
  51. class linkList
  52. {
  53.    FuncInfo fi;
  54.    linkList next;
  55. }
  56.  
  57. ///////////////////////////////////////////////////////////////////
  58. // The "struct" that contains all the information
  59. // than any function/transition would need.
  60. class FuncInfo
  61. {
  62.    int func;
  63.    int delay;
  64.    int startspace, endspace;
  65.    int times, remaining;
  66.    boolean centered;
  67.    String color;
  68.    String text;
  69.    linkList ret;  // pointer to the return place in the script (for loops);
  70. }
  71.  
  72. ///////////////////////////////////////////////////////////////////
  73. ///////////////////////////////////////////////////////////////////
  74. // The class that parses the script and keeps it in memory 
  75. class Script
  76. {
  77.    linkList list;               // the linked list for the script
  78.    linkList ptr,start;          // the current line and start of the list
  79.    String scrpt;
  80.    URL baseURL;
  81.  
  82.    ///////////////////////////////////////////////////////////////////
  83.    // The constructor
  84.    public Script(URL url, String s) throws IOException
  85.    {
  86.       scrpt = s;
  87.       baseURL = url;
  88.       initScript();
  89.    }
  90.  
  91.    ///////////////////////////////////////////////////////////////////
  92.    // get the parameters from the functions in the script
  93.    String getParam(String s, String sub)
  94.    {
  95.       int i,j;
  96.       String tmp;
  97.  
  98.       i = s.indexOf(sub);
  99.       j = s.indexOf("text");
  100.  
  101.       if(j == -1 || i <= j)  // if the first occurance of "sub" is before 
  102.       {                    // the "text=" (ie not in the message)
  103.          if(i == -1)
  104.             return null;
  105.          else
  106.          {
  107.             tmp = s.substring(i);  // forget everything before the sub
  108.             i = tmp.indexOf("=");
  109.             if(i == -1)
  110.             {
  111.                System.out.println("Error in '"+sub+"' parameter in "+s);
  112.                return null;
  113.             }
  114.             else
  115.             {
  116.                i++;  // one spot after the "="
  117.                if(sub.compareTo("text") == 0)
  118.                   tmp = tmp.substring(i);
  119.                else
  120.                {
  121.                   tmp = tmp.substring(i);
  122.                   if(tmp.indexOf(" ") != -1)
  123.                      tmp = tmp.substring(0,tmp.indexOf(" "));
  124.                }
  125.                tmp.trim();
  126.                return tmp;
  127.             }
  128.          }
  129.       }
  130.       else
  131.          return null;
  132.  
  133.    }  // End getParam()
  134.    
  135.    ///////////////////////////////////////////////////////////////////
  136.    // get the function info
  137.    FuncInfo getFunc(String s)
  138.    {
  139.       int i;
  140.       String tmp;
  141.       FuncInfo fi = new FuncInfo();
  142.       
  143.       // Assign the defaults
  144.       fi.func = -1;
  145.       fi.delay = 40;
  146.       fi.startspace = 10;
  147.       fi.endspace = 20;
  148.       fi.times = -1;
  149.       fi.remaining = 0;
  150.       fi.centered = false;
  151.       fi.color = new String("");
  152.       fi.text = new String("No text specified");
  153.       fi.ret = null;
  154.       
  155.       //get rid of any starting (and ending) white space, just to be sure.
  156.       s = s.trim(); 
  157.  
  158.       ////////////////////////////////////////////////////
  159.       // Any parameters that might exist.  This will
  160.       // read in any command line parameters for each
  161.       // function.  For example: Sleep text=blah blah
  162.       // is accepted, but the text will never be used
  163.  
  164.       tmp = getParam(s,"delay");
  165.       if(tmp != null)
  166.          fi.delay = (new Integer(tmp)).intValue();
  167.  
  168.       tmp = getParam(s,"clear");
  169.       if(tmp != null && tmp.compareTo("true") == 0)
  170.       {
  171.          fi.centered = true;
  172.          fi.text = new String("");
  173.       }
  174.       else
  175.       {
  176.          tmp = getParam(s,"center");
  177.          if(tmp != null && tmp.compareTo("true") == 0)
  178.             fi.centered = true;
  179.          else
  180.          {
  181.             fi.centered = false;
  182.             tmp = getParam(s,"startspace");
  183.             if(tmp != null)
  184.                fi.startspace = (new Integer(tmp)).intValue();
  185.  
  186.             tmp = getParam(s,"endspace");
  187.             if(tmp != null)
  188.                fi.endspace = (new Integer(tmp)).intValue();
  189.          }
  190.  
  191.          tmp = getParam(s,"text");
  192.          if(tmp != null)
  193.             fi.text = tmp;
  194.       }
  195.  
  196.       tmp = getParam(s,"times");
  197.       if(tmp != null)
  198.       {
  199.          fi.times = (new Integer(tmp)).intValue();
  200.          fi.remaining = fi.times;
  201.       }
  202.  
  203.       tmp = getParam(s,"pixels");
  204.       if(tmp != null)
  205.       {
  206.          fi.times = (new Integer(tmp)).intValue();
  207.          fi.remaining = fi.times;
  208.       }
  209.  
  210.       ////////////////////////////////////////////////////
  211.       // set the function number (and some minor
  212.       // tweeks/precautions)
  213.       i = s.indexOf(" ");
  214.       if(i != -1)
  215.          tmp = s.substring(0,i);
  216.       else
  217.          tmp = s;
  218.          
  219.       if(tmp.compareTo("Appear") == 0)
  220.       {
  221.          fi.func = 0;
  222.       }
  223.       else if(tmp.compareTo("Sleep") == 0)
  224.       {
  225.          fi.func = 1;
  226.       }
  227.       else if(tmp.compareTo("ScrollLeft") == 0)
  228.       {
  229.          fi.func = 2;
  230.       }
  231.       else if(tmp.compareTo("ScrollRight") == 0)
  232.       {
  233.          fi.func = 3;
  234.       }
  235.       else if(tmp.compareTo("ScrollUp") == 0)
  236.       {
  237.          fi.func = 4;
  238.       }
  239.       else if(tmp.compareTo("ScrollDown") == 0)
  240.       {
  241.          fi.func = 5;
  242.       }
  243.       else if(tmp.compareTo("Pixel") == 0)
  244.       {
  245.          fi.func = 6;
  246.          
  247.          // Just for precautions dealing with a delay problem.
  248.          // This shouldn't be noticable.
  249.          if(fi.delay < 1)
  250.             fi.delay = 1;
  251.  
  252.          // Can't allow "times" to be 0 or less, it will cause
  253.          // the sign to freeze (not procede).
  254.          if(fi.times < 1)
  255.             fi.times = 15;
  256.       }
  257.       else if(tmp.compareTo("Blink") == 0)
  258.       {
  259.          fi.func = 7;
  260.          
  261.          if(fi.times < 1)
  262.             fi.times = 2;
  263.       }
  264.       else if(tmp.compareTo("OverRight") == 0)
  265.       {
  266.          fi.func = 8;
  267.       }
  268.       else if(tmp.compareTo("ScrollCenter") == 0)
  269.       {
  270.          fi.func = 9;
  271.       }
  272.       else if(tmp.compareTo("OverCenter") == 0)
  273.       {
  274.          fi.func = 10;
  275.       }
  276.       else if(tmp.compareTo("OverLeft") == 0)
  277.       {
  278.          fi.func = 11;
  279.       }
  280.       else if(tmp.compareTo("OverUp") == 0)
  281.       {
  282.          fi.func = 12;
  283.       }
  284.       else if(tmp.compareTo("OverDown") == 0)
  285.       {
  286.          fi.func = 13;
  287.       }
  288.       else if(tmp.compareTo("Do") == 0)
  289.       {
  290.          fi.func = 97;  // This marks a place for the "repeats" to go back to.
  291.       }
  292.       else if(tmp.compareTo("Repeat") == 0)
  293.       {
  294.          fi.func = 98;
  295.       }
  296.       else if(tmp.compareTo("Reload") == 0)
  297.       {
  298.          fi.func = 99;
  299.       }
  300.  
  301.       return fi;
  302.    }  // End getFunc()
  303.  
  304.    //////////////////////////////////////////////////////////////////
  305.    // get the next function
  306.    FuncInfo nextFunc()
  307.    {
  308.       FuncInfo fi;
  309.  
  310.       fi = ptr.fi;
  311.       ptr = ptr.next;
  312.       
  313.       switch(fi.func)
  314.       {
  315.          case 97:  // Do
  316.             fi = nextFunc();   // skip the "Do function; its just a marker
  317.            break;
  318.  
  319.          case 98:  // a Repeat
  320.  
  321.             // If it doesn't repeat infinitely...
  322.             if(fi.times != -1)
  323.             {
  324.                // One less time
  325.                fi.remaining--;
  326.                if(fi.remaining == 0)
  327.                {
  328.                   fi.remaining = fi.times;  // reset the loop
  329.                   fi = nextFunc();
  330.                }
  331.                else
  332.                {
  333.                   ptr = fi.ret;  // Jump back to the last "Do"
  334.                   fi = nextFunc();
  335.                }
  336.             }
  337.             else
  338.             {
  339.                ptr = fi.ret;  // Jump back to the last "Do"
  340.                fi = nextFunc();
  341.             }
  342.            break;
  343.  
  344.          case 99:  // Reload
  345.             try {
  346.         initScript();      // Reload the script from the URL
  347.         } catch (IOException e) {
  348.         }
  349.             fi = nextFunc();   // and get the first function.
  350.            break;
  351.       }
  352.  
  353.       return fi;
  354.    }  // End nextFunc()
  355.  
  356.    //////////////////////////////////////////////////////////////////
  357.    // just a simple function to see if it is a color code
  358.    boolean isColor(char t)
  359.    {
  360.       if(t == 'r' || t == 'g' || t == 'b' || t == 'y' || t == 'o' || t == 'p')
  361.          return true;
  362.       else
  363.          return false;
  364.    }
  365.       
  366.    //////////////////////////////////////////////////////////////////
  367.    // Read in the script into a linked list of FuncInfo's 
  368.    void initScript() throws IOException
  369.    {
  370.       InputStream file;
  371.       DataInputStream dis;
  372.       String line;
  373.       String tmp;
  374.       int listlen;
  375.       int a,b;
  376.       int dos;
  377.       char c;
  378.       char t;
  379.  
  380.       file = (new URL(baseURL,scrpt)).openStream();
  381.       dis = new DataInputStream(file);
  382.  
  383.       list = new linkList();                                    // The linked list
  384.       start = list;                                             // The head of the list
  385.       ptr = list;                                               // The current element
  386.       listlen = 0;
  387.       dos = 0;                                                  // Used to know how many Do's there are
  388.       while((line = dis.readLine()) != null)
  389.       {
  390.          line = line.trim();                                    // cut off white space at the beginning and end
  391.          if(!(line.startsWith("!!")) && (line.length() != 0))   // Not a comment or blank line
  392.          {
  393.             listlen++;
  394.             ptr.fi = getFunc(line);                             // Get the function number
  395.             if(ptr.fi.func == 97)
  396.                dos++;                                           // Chalk up another "Do"
  397.             ptr.next = new linkList();
  398.             ptr = ptr.next;  // advance to the next command
  399.          }
  400.       }
  401.  
  402.       // Parse out the color codes!!!!  (if there are any)
  403.       ptr = start;
  404.       for(a=0;a<listlen;a++)
  405.       {
  406.          if(ptr.fi.func >= 2 && ptr.fi.func <= 97)
  407.          {
  408.             tmp = ptr.fi.text;
  409.             c = 'r';  // the default color
  410.             for(b=0;b<tmp.length();b++)
  411.             {
  412.                if((char)(tmp.charAt(b)) == (char)('\\'))  // if there is a '\' does the following
  413.                {                                          // letter indicate a color.
  414.                   b++;
  415.                   t = tmp.charAt(b);
  416.                   if(isColor(t))
  417.                   {
  418.                      c = t;
  419.                      tmp = (tmp.substring(0,b-1)).concat(tmp.substring(b+1));  // take the "\r" out
  420.                      b-=1;
  421.                   }
  422.                   else if(t == '\\')  // Are they trying to delimit the backslash?
  423.                   {
  424.                      tmp = (tmp.substring(0,b)).concat(tmp.substring(b+1));  // delimit the '\'
  425.                      b--;
  426.                   }
  427.                }
  428.  
  429.                ptr.fi.color = ptr.fi.color.concat((new Character(c)).toString());
  430.             }
  431.             ptr.fi.text = tmp;
  432.          }
  433.          ptr = ptr.next;
  434.       }
  435.  
  436.       // Ok now lets set the return pointers for the loops
  437.       ptr = start;
  438.       linkList stack[] = new linkList[dos];  // Allocate the array
  439.       dos = 0;
  440.       for(a=0;a<listlen;a++)
  441.       {
  442.          if(ptr.fi.func == 97)
  443.          {
  444.             stack[a] = new linkList();
  445.             stack[a] = ptr;
  446.             dos++;
  447.          }
  448.          else if(ptr.fi.func == 98)
  449.          {
  450.             if(dos > 0)
  451.             {
  452.                ptr.fi.ret = stack[dos-1];
  453.                dos--;
  454.             }
  455.             else
  456.             {
  457.                // OMYGOSH!! Script error output!!!!
  458.                System.out.println("Repeat error in line : Repeat times="+ptr.fi.times);
  459.                System.out.println("     Mismatched Do/Repeats?");
  460.             }
  461.          }
  462.          ptr = ptr.next;
  463.       }
  464.  
  465.       ptr = start;
  466.  
  467.       file.close();
  468.       dis.close();
  469.  
  470.    }  // End initScript()
  471. }  // End Class Script
  472.